package video.background.Utils;

import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import com.qcloud.cos.model.*;
import com.qcloud.cos.region.Region;
import com.tencent.cloud.CosStsClient;
import com.tencent.cloud.Response;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.Random;
import java.util.TreeMap;

/**
 * @program: background
 * @description:
 * @author: hlt
 * @create: 2023-08-10 11:39
 **/
// 将文件上传至腾讯云对象存储
public class TencentCOSUtil {
    // 存储桶名称
    private static final String bucketName = "smart-box-1311261154";
    //secretId 秘钥id
    private static final String SecretId = "AKIDDFBuNeiYmmX3MRK4cw0paLxKTMCrYSCi";
    //SecretKey 秘钥
    private static final String SecretKey = "Xs0wiKl3IPJ1Zt051lIchWJxObpsjSF4";
    // 腾讯云 自定义文件夹名称
    private static final String prefix = "/home/SmartBox/";
    // 存储桶所在地域
    private static final String region = "ap-nanjing";
    // 访问域名
    public static final String URL = "https://smart-box-1311261154.cos.ap-nanjing.myqcloud.com/";
    // 创建COS 凭证
    private static COSCredentials credentials = new BasicCOSCredentials(SecretId,SecretKey);
    // 配置 COS 区域
    private static ClientConfig clientConfig = new ClientConfig(new Region("ap-nanjing"));

    /**
     * foldName: 暂时有两种选择：
     *              UsersAvatar：用户头像的文件夹
     *              GroupAvatar：团队头像的文件夹
     *              VoiceFiles：全部声纹的文件夹
     */
    public static String uploadfileFromBin(String foldName, String filename, MultipartFile file){
        // 创建 COS 客户端连接
        COSClient cosClient = new COSClient(credentials,clientConfig);
        String key = "voices/" + foldName + "/" + filename;
        try {
            File localFile = File.createTempFile(key, "png"); // 创建临时文件
            file.transferTo(localFile);   // 将前端传递的文件上传到临时文件中
            // 将 文件上传至 COS
            PutObjectRequest objectRequest = new PutObjectRequest(bucketName, key, localFile);
            cosClient.putObject(objectRequest);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            cosClient.shutdown();  //关闭服务
        }
        return URL + key;
    }

    public static boolean deleteFile(String foldName, String filename){
        String key = "voices/" + foldName + "/" + filename;
        COSClient cosClient = new COSClient(credentials, clientConfig);
        try {
            cosClient.deleteObject(bucketName, key);
        } catch (CosClientException e) {
            e.printStackTrace();
            return false;
        } finally {
            cosClient.shutdown();
        }
        return true;
    }

    // 获取临时密钥
    public static Response getTempSecret() {
        TreeMap<String, Object> config = new TreeMap<>();
        try {
            // 替换为您的云 api 密钥 SecretId
            config.put("secretId", SecretId);
            // 替换为您的云 api 密钥 SecretKey
            config.put("secretKey", SecretKey);


            // 临时密钥有效时长，单位是秒，默认 1800 秒，目前主账号最长 2 小时（即 7200 秒），子账号最长 36 小时（即 129600）秒
            config.put("durationSeconds", 1800);   // 半小时

            // 换成您的 bucket
            config.put("bucket", bucketName);
            // 换成 bucket 所在地区
            config.put("region", region);


            // 这里改成允许的路径前缀，可以根据自己网站的用户登录态判断允许上传的具体路径
            // 列举几种典型的前缀授权场景：
            // 1、允许访问所有对象："*"
            // 2、允许访问指定的对象："a/a1.txt", "b/b1.txt"
            // 3、允许访问指定前缀的对象："a*", "a/*", "b/*"
            // 如果填写了“*”，将允许用户访问所有资源；除非业务需要，否则请按照最小权限原则授予用户相应的访问权限范围。
            config.put("allowPrefixes", new String[] {"voices/*"});


            // 密钥的权限列表。必须在这里指定本次临时密钥所需要的权限。
            // 简单上传、表单上传和分块上传需要以下的权限，其他权限列表请参见 https://cloud.tencent.com/document/product/436/31923
            String[] allowActions = new String[] {"name/cos:GetObject"}; // 只有下载权限
            config.put("allowActions", allowActions);
            Response response = CosStsClient.getCredential(config);
            return response;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
